파이썬 객체지향 프로그래밍 기초 1

객체

프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수(variable)에 넣어서 사용하고 데이터를 조작하는 일은 함수(function)로 구성해서 쉽게 실행시킬 수 있도록 만들어 놓는다.

객체(object)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다.

집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체에 합쳐진 함수는 함수가 아니라 메서드(method)라고 부른다.

예: 사각형의 면적 구하기

예를 들어 사각형의 면적을 구하는 프로그램을 만든다고 하자. 필요한 변수와 함수는 다음과 같다.

  1. 가로 길이와 세로 길이라는 두 개의 데이터를 넣을 변수
  2. 두 길이를 곱해서 면적을 구하는 함수

객체지향을 사용하지 않고 파이썬으로 구현하면 다음과 같아진다.


In [1]:
h = 10
v = 20

def area(h, v):
    return h * v

a = area(h, v)
print(a)


200

위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h, 사각형의 세로 길이를 나타내는 변수 v, 그리고 이 사각형의 면적을 계산하는 함수 area()는 제각기 떨어져 있다. 하지만 객체 지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다.

다음은 이 프로그램을 객체 지향 방식으로 다시 구현한 것이다.


In [2]:
class Rectangle(object):
    
    def __init__(self, h, v):
        self.h = h
        self.v = v
        
    def area(self):
        return self.h * self.v

이 부분은 클래스(class) 구현이라고 한다. 실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.


In [3]:
r = Rectangle(10, 20)    
a = r.area()
print(a)


200

위 프로그램에서 r이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.

객체 r은 사각형의 가로 길이와 세로 길이를 나타내는 변수 hv 그리고 면적을 계산하는 함수 area()가 합쳐져서 만들어진 것이다. 객체 r에 포함된 이 변수들과 함수, 즉 속성을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 속성 이름을 치면 된다. 다음과 같이 입력해 보면 알 수 있다.


In [4]:
r.h


Out[4]:
10

In [5]:
r.v


Out[5]:
20

In [6]:
r.area()


Out[6]:
200

클래스

객체 지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.

위 예제에서 Rectangle은 클래스이고 rRectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 "붕어빵"과 "붕어빵을 굽는 틀"에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.

예를 들어 위에서 만들어 놓은 Rectangle 클래스로 다음과 같이 5개의 사각형을 만들 수도 있다.


In [7]:
a = Rectangle(1, 1)   # 가로 1, 세로 1인 사각형
b = Rectangle(2, 1)   # 가로 2, 세로 1인 사각형
c = Rectangle(4, 2)   # 가로 4, 세로 2인 사각형
d = Rectangle(6, 3)   # 가로 6, 세로 3인 사각형
e = Rectangle(8, 5)   # 가로 8, 세로 5인 사각형

이 사각형들의 면적은 다음과 같이 계산한다.


In [8]:
print(a.area())
print(b.area())
print(c.area())
print(d.area())
print(e.area())


1
2
8
18
40

생성자

파이썬에서 클래스를 정의하는 문법은 다음과 같다.

class 클래스이름(object):

    def __init__(self, 속성값1, 속성값2, 속성값3):
        self.속성이름1 = 속성값1
        self.속성이름2 = 속성값2
        self.속성이름3 = 속성값3

이 때 속성값 인수는 필요하지 않다면 없어도 된다.

여기에서 class 블럭안에 정의된 __init__란 함수는 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.

객체를 생성할 때는 클래스이름이란 이름을 가진 함수를 호출해야 하는데 이 때 실제로는 __init__로 정의된 생성자 함수가 호출된다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.

즉, init은 초기값을 저장한다고 보면 된다

연습 문제 1

삼각형의 넓이를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.

  • 밑변의 길이 b 와 높이 h
  • 삼각형의 넓이를 계산하는 메서드 area

In [16]:
class triangle:
    
    def __init__(self, b, h):
        self.b = b
        self.h = h
        
    def area(self):
        return self.b * self.h

In [17]:
a = triangle(10, 20)

In [20]:
a.area()


Out[20]:
200

연습 문제 2

사각 기둥의 부피를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.

  • 밑면의 가로 길이 a, 밑면의 세로 길이 b, 높이 h
  • 부피를 계산하는 메서드 volume
  • 겉넓이를 계산하는 메서드 surface

In [47]:
class 사각기둥부피:
    
    def __init__(self, a1, b1, h1):
        self.a1 = a1
        self.b1 = b1
        self.h1 = h1
        
    def volume(self):
        return self.a1 * self.b1 * self.h1
    
    def surface(self):
        return 2(self.a1*self.b1+self.b1*self.h1+self.h1*self.a1)

In [48]:
make_sample = 사각기둥부피(10,20,2)

In [49]:
make_sample.volume()


Out[49]:
400

In [50]:
make_sample.surface()


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-50-a71ce00c7aa8> in <module>()
----> 1 make_sample.surface()

<ipython-input-47-aaafa979f0d2> in surface(self)
     10 
     11     def surface(self):
---> 12         return 2(self.a1*self.b1+self.b1*self.h1+self.h1*self.a1)

TypeError: 'int' object is not callable

In [ ]: